/*
 * Archivo.cpp
 *
 *  Created on: Sep 11, 2012
 *      Author: romina
 */

#include "ArchivosManager.h"

namespace archivos {

ArchivoBase::ArchivoBase(){
	this->path = "";
	this->filename = "";
}

ArchivoBase::ArchivoBase(string path){
	this->path = path;

	size_t pos = this->path.find_last_of("\\");
	if(pos != std::string::npos)
		this->filename.assign(path.begin() + pos + 1, path.end());
	else
	    this->filename = path;
}

bool ArchivoBase::existe(string filename){

	fstream file;
	file.open(filename.c_str(), fstream::in | fstream::out);
	if (file.is_open()) {
		file.close();
	    return true;
	}
	return false;
}

string ArchivoBase::getPath(){
	return this->path;
}

void ArchivoBase::ir_al_principio(){
	archivo.seekg(0, ios::beg);
}

int ArchivoBase::getchar(){
	int c = 0;
	archivo >> c;
	return c;
}

string ArchivoBase::obtenerLinea(){
	string line;
	getline(archivo, line);
	return line;
}

string ArchivoBase::obtenerPalabra(){
	string s;
	this->archivo >> s;
	return s;
}

void ArchivoBase::escribirPalabra(string palabra){
	archivo << palabra;
}

void ArchivoBase::escribirLinea(string linea){
	archivo << linea << endl;
}

bool ArchivoBase::is_EOF(){
	return archivo.eof();
}

ArchivoBase::~ArchivoBase(){
	archivo.close();
}

ArchivoDeTexto::ArchivoDeTexto(string path, MODOAPERTURA modo) : ArchivoBase(path){

	switch (modo) {
		case R:
			archivo.open(path.c_str(), std::fstream::in);
			break;
		case W:
			archivo.open(path.c_str(), std::fstream::out);
			break;
		case RW:
			if (!ArchivoBase::existe(path)){
				archivo.open(path.c_str(), std::fstream::out);
				archivo.close();
			}
			archivo.open(path.c_str(), std::fstream::in | std::fstream::out);
			break;
		default:
			throw (FaltaElModoDeAperturaException());
			break;
	}
	if (!archivo.is_open()){
		throw std::ios_base::failure("Error al intentar abrir / crear el archivo => " + this->path);
	}
}

ArchivoDeTexto::~ArchivoDeTexto(){
}


ArchivoBinario::ArchivoBinario() : ArchivoBase(){

}

ArchivoBinario::ArchivoBinario(string path, MODOAPERTURA modo) : ArchivoBase(path){

	switch (modo) {
		case R:
			archivo.open(path.c_str(), std::fstream::in | std::fstream::binary);
			break;
		case W:
			archivo.open(path.c_str(), std::fstream::out | std::fstream::binary);
			break;
		case RW:
			if (!ArchivoBase::existe(path))
				archivo.open(path.c_str(), std::fstream::out | std::fstream::binary);
			else
				archivo.open(path.c_str(), std::fstream::in | std::fstream::out | std::fstream::binary);
			break;
		default:
			throw (FaltaElModoDeAperturaException());
			break;
	}
	if (!archivo.is_open()){
		throw std::ios_base::failure("Error al intentar abrir / crear el archivo");
	}
}


void ArchivoBinario::crear(string filename){
	fstream file;
	file.open(filename.c_str(), fstream::out | fstream::binary);
	file.close();
}

void ArchivoBinario::write(char * buffer, int long_buffer){
    archivo.write(&buffer[0],long_buffer);
}

void ArchivoBinario::read(char * buffer, int long_buffer){
	archivo.read(buffer , long_buffer);
}

ArchivoBinario::~ArchivoBinario(){
}

} /* namespace archivo */
